home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / SourceCode / Palettes / TTools / TToolsPalette / TBinderList.subproj / TBinderInspector.m < prev    next >
Encoding:
Text File  |  1995-06-12  |  3.5 KB  |  145 lines

  1. /* TBinderInspector.m
  2.  * Written By:  Thomas Burkholder
  3.  *
  4.  * You may freely copy, distribute, and reuse the code in this example.
  5.  * NeXT disclaims any warranty of any kind, expressed or  implied, as to its
  6.  * fitness for any particular use.
  7.  */
  8.  
  9. #import "TBinderInspector.h"
  10. #import <objc/objc.h>
  11. #import "TBinder.h"
  12. #import "TBinderListConnectInspector.h"
  13. #import "TDataSourceConnector.h"
  14. #import "SelChooser.h"
  15.  
  16. @implementation TBinderInspector
  17.  
  18. - awakeFromNib
  19. {
  20.     fields[0] = interfaceAccessorField;
  21.     fields[1] = interfaceModifierField;
  22.     fields[2] = dataSourceAccessorField;
  23.     fields[3] = dataSourceModifierField;
  24.     return self;
  25. }
  26.  
  27. - inspectorView
  28. {
  29.     return inspectorView;
  30. }
  31.  
  32. - inspectBinder:anObject andReturnTo:otherObject
  33. {
  34.     binder = anObject;
  35.     connectInspector = otherObject;
  36.     [self revert:self];
  37.     return self;
  38. }
  39.  
  40. - choose:sender
  41. {
  42.     int t = [sender tag];
  43.     id binderList =[getTConnectorForDestination([binder interface]) source];
  44.     id src = [getDSConnectorForSource(binderList) destination];
  45.     const char *str;
  46.  
  47.     str = sel_getName([SelChooser chooseSelectorFor:
  48.                     (t/2)?[src class]:[[binder interface] class]
  49.                                 numArgs:(t%2)
  50.                     startWith:sel_getUid([fields[t] stringValue])]);
  51.  
  52.     [fields[t] setStringValue:str];
  53.     [self ok:self];
  54.     return self;
  55. }
  56.  
  57. - ok:sender
  58. {
  59.  
  60.     [binder setInterfaceAccessor:
  61.                 sel_getUid([interfaceAccessorField stringValue])];
  62.     [binder setInterfaceModifier:
  63.                 sel_getUid([interfaceModifierField stringValue])];
  64.     [binder setDataSourceAccessor:
  65.                 sel_getUid([dataSourceAccessorField stringValue])];
  66.     [binder setDataSourceModifier:
  67.                 sel_getUid([dataSourceModifierField stringValue])];
  68.     [binder setVerify:[verifySwitch state]];
  69.     [binder setAutoUpdate:[autoUpdateSwitch state]];
  70.     return self;
  71. }
  72.  
  73. - doneAfterDelay:sender
  74. {
  75.     [self perform:@selector(done:) with:sender afterDelay:0
  76.                                         cancelPrevious:NO];
  77.     return self;
  78. }
  79.  
  80. - done:sender
  81. {
  82.     [[inspectorView window] disableFlushWindow];
  83.     [connectInspector revert:self];
  84.     [[connectInspector window] reenableFlushWindow];
  85.     [[connectInspector window] flushWindow];
  86.     return self;
  87. }
  88. - revert:sender
  89. {
  90.     [interfaceAccessorField setStringValue:
  91.             sel_getName([binder interfaceAccessor])];
  92.     [interfaceModifierField setStringValue:
  93.             sel_getName([binder interfaceModifier])];
  94.     [dataSourceAccessorField setStringValue:
  95.             sel_getName([binder dataSourceAccessor])];
  96.     [dataSourceModifierField setStringValue:
  97.             sel_getName([binder dataSourceModifier])];
  98.     [verifySwitch setState:[binder verify]];
  99.     [autoUpdateSwitch setState:[binder autoUpdate]];
  100.     return self;
  101. }
  102.  
  103. int selectorCheck(const char *method, id object, int args)
  104. {
  105.     BOOL b;
  106.     SEL aSel=sel_getUid(method);
  107.     int actualArgs;
  108.  
  109.     b =(aSel && sel_isMapped(aSel) && [object respondsTo:aSel]);
  110.  
  111.     if (!b) return 0;
  112.     
  113.     // remember that any method takes at least 2 args, self and _cmd
  114.     actualArgs = method_getNumberOfArguments(
  115.             class_getInstanceMethod([object class], aSel)) - 2;
  116.     return (b && (args == actualArgs));
  117. }
  118.  
  119. // text delegate methods
  120. - (BOOL)textWillEnd:sender
  121. {
  122.     id controlEdited = [sender delegate];
  123.     id dest = [binder interface];
  124.     id binderList =[getTConnectorForDestination([binder interface]) source];
  125.     id src = [getDSConnectorForSource(binderList) destination];
  126.     char *str = alloca([sender textLength]+1);
  127.     id testobj;
  128.     int numArgs;
  129.  
  130.     [sender getSubstring:str start:0 length:[sender textLength]+1];
  131.  
  132.     if (!dest) return YES;
  133.     if (!src) return NO;
  134.  
  135.     testobj = ([controlEdited tag] <=1)?dest:src;
  136.     numArgs = ([controlEdited tag]%2);
  137.  
  138.     if (!selectorCheck(str,testobj,numArgs))
  139.         return YES;
  140.  
  141.     return NO;
  142. }
  143.  
  144. @end
  145.